#include <Windows.h>
#include <stdio.h>

void sleep_test();
void Sleep_test();

int main() {
    //sleep,    unistd.h
    sleep_test();
    //Sleep,    Windows.h
    Sleep_test();

    return EXIT_SUCCESS;
}

/**
 * 1.sleep
 */
#include <unistd.h>
void sleep_test() {
    printf("sleep(1U); start\n");
    /**
     * #include <unistd.h>
     * unsigned int __cdecl sleep (unsigned int);
     *
     * Win7版/Linux: 毫秒?, Dev-C++
     * Win8版本    : 秒?
     * Win10版本   : 秒
     */
    sleep(1U);
    printf("sleep: end\n");
}

/**
 * 2.Sleep
 */
void Sleep_test() {
    printf("Sleep(1000L); start\n");
    /**
     * WINBASEAPI VOID WINAPI Sleep (DWORD dwMilliseconds);
     */
    Sleep(1000L);   //睡眠1秒
    printf("sleep: end\n");
}

/**
 * 查询或设置系统级参数 https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-systemparametersinfoa
 * @param imaPath 桌面背景图片地址
 */
void set_deskwall_paper(char *imaPath) {
    /**
     * 设置桌面背景, Windows.h
     * @param uiAction unsigned int, 你想干啥.  20: 设置系统背景图片
     * @param uiParam unsigned int,
     * @param pvParam typedef void *PVOID; 图片地址
     * @param fWinIni unsigned int, 如果设置了系统参数，则指定是否要更新用户配置文件;如果是，则是否将 WM_SETTINGCHANGE 消息广播到所有顶级窗口，以通知他们更改。
     * @return TRUE成功, 否则失败
     * WINUSERAPI WINBOOL WINAPI SystemParametersInfoA(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinIni);
     */
    SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, imaPath, SPIF_UPDATEINIFILE);
}

/**
 * 设置控制台光标位置
 * @param x
 * @param y
 */
static COORD coord;
WINBOOL setConsoleCursorPosition(SHORT x, SHORT y) {
    coord.X = x;
    coord.Y = y;
    /**
     * #include <windows.h>
     * 设置控制台光标位置 <br />
     * WINBASEAPI WINBOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD dwCursorPosition); <br />
     * Console: n.控制台 <br />
     * Cursor : n.光标,游标,指针
     * @param hConsoleOutput HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
     * @param dwCursorPosition 是 Windows API 中定义的一种结构, 表示1个字符在控制台屏幕上的坐标.
     * @return 0失败, 否则成功
     */
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    WINBOOL success = SetConsoleCursorPosition(handle, coord);
    return success;
}

/**
 * 设置控制台光标显示/隐藏
 * @param visible 是否显示
 * @return
 */
static CONSOLE_CURSOR_INFO info;
WINBOOL setConsoleCursorInfo(BOOLEAN visible) {
    info.dwSize = sizeof(info);
    info.bVisible = visible;
    return SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
}